package com.wang;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

//JAVA8四大内置函数式接口
public class LambdaFunction {

    public static void main(String[] args) {
//        test1();
//        test2();
//        test3();
//        test4();
        test5();
    }

    //需求：将一个字符串集合按照某个规则(长度大于5的字符串)进行筛选，生成新的字符串集合。
    public static void test5(){
        List<String> strings = Arrays.asList("Hello", "123", "1", "com.wang", "qwertzxcv");
        List<String> strings1 = strFilter(strings, (s) -> s.length() > 5);
        System.out.println("strings1 = " + strings1);
    }

    public static List<String> strFilter(List<String> strings, Predicate<String> predicate){
        ArrayList<String> resList = new ArrayList<>();
        for (String s : strings) {
            if (predicate.test(s)){
                resList.add(s);
            }
        }
        return resList;
    }

    public static void test4(){
        //去掉收尾空格和制表符
        String s = strHandle("\t\t\t 123456    ", (a) -> a.trim());
        System.out.println("s = " + s);

        //截取
        String s1 = strHandle("123456", (a) -> a.substring(2, 4));
        System.out.println("s1 = " + s1);

    }

    //FUnction <T> ： 函数型接口
    //需求：处理字符串
    public static String strHandle(String str, Function<String,String> function){
        return function.apply(str);
    }

    //Consumer <T> ： 消费型接口。无返回值。
    public static void test1(){
        buy(10000d,(m)-> System.out.println("买东西花了" + m + "元"));
    }
    public static void buy(Double money, Consumer<Double> consumer){
        consumer.accept(money);
    }

    //Supplier<T> : 供给型接口。 返回一些对象。
    //需求：产生指定个数整数，并放入集合中去。产生整数的规则需要在调用时指定。
    public static void test2(){
        //生成10个整数
        Integer num  = 10;
        //生成list
        List<Integer> list = getList(num,
                //生成规则：随机数
                () -> (int)(Math.random()*100));
        //打印list
        System.out.println("list = " + list);


    }

    private static void test3() {
        Supplier<Integer> supplier = ()->(int)(Math.random()*100);
        Integer integer = supplier.get();
        System.out.println("integer = " + integer);
    }

    /*
        参数列表： num -> 生成的整数的个数
                 supplier -> 供给型接口
     */
    public static List<Integer> getList(Integer num, Supplier<Integer> supplier){
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i<num ;i++){
            Integer r = supplier.get();
            integers.add(r);
        }
        return integers;
    }
}
